package dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import pojo.Atividade;
import pojo.AlunoTurma;
import pojo.NotaAtividade;
import pojo.Turma;


public class AtividadeDaoImp implements AtividadeDao {
	
	private List<Atividade> atividades;
	private static int nextId;
	
	public AtividadeDaoImp(){
		atividades = new ArrayList<Atividade>();
		loadData();
	}
	public void loadData() {
		try{
			File in = new File("files/Atividade.txt");
			InputStream fileLeitura = new  FileInputStream(in);
			InputStreamReader wLeitura = new InputStreamReader(fileLeitura);  
			BufferedReader bufLeitura = new BufferedReader(wLeitura);

			String linha = bufLeitura.readLine();
			this.atividades.clear();
			Atividade a;
			while(linha!= null) {
				
				String s[] = linha.split("\\t");
				s[6] = s[6].replace(",", ".");
				a = new Atividade(Integer.parseInt(s[0]), s[1],s[2], 
						new GregorianCalendar(Integer.parseInt(s[5]),
								Integer.parseInt(s[4]), Integer.parseInt(s[3])),
						Float.parseFloat(s[6]), Integer.parseInt(s[7]));
				this.atividades.add(a);
				linha = bufLeitura.readLine();
			}
			
			bufLeitura.close();
			wLeitura.close();
			fileLeitura.close();
		} catch (NumberFormatException e) {
			String erro = "ERRO: Dados de Atividades corromppojo.Atividade;idos." +
					"\nFeche seus trabalhos e solicite ao administrador" +
					" uma restauracao deste sistema.";
			System.out.println(erro);
			// throw new IOException(erro);
		} catch (FileNotFoundException e) {
		 
			
		}	catch (IOException e) {
			String erro = "Aviso: Nao foi possivel encontrar os dados das " +
					"Atividades. Se esta for a primeira execucao do sistema " +
					"por favor desconsidere o problema, caso contrario " +
					"feche o programa e contate o administrador.";
			System.out.println(erro);
			// throw new IOException(erro);
		}
		updateNextId();
	}
	@Override
	public void saveData() {
		try{
			File out = new File("files/Atividade.txt");
			OutputStream fileEscrita = new  FileOutputStream(out);
			OutputStreamWriter wEscrita = new OutputStreamWriter(fileEscrita);  
			BufferedWriter bufEscrita = new BufferedWriter(wEscrita);
					
			for (Atividade atividade : this.atividades) {
				bufEscrita.write(atividade.toStringIDs()+"\n");
			}
			
			bufEscrita.close();
			wEscrita.close();
			fileEscrita.close();
		} catch (IOException e){
			System.out.println(e);
		}
		
	}
	@Override
	public boolean add(Atividade at) {
		addList(at);
		return true;
	}
	@Override
	public boolean add(Atividade at, NotaAtividadeDao regAtDao,AlunoTurmaDao regDao, TurmaDao turmaDao) {
		Turma turma = turmaDao.get(at.getTurmaId());
		addList(at);
		NotaAtividade regAtividade;
		for (AlunoTurma registro : turmaDao.getByTurma(turma, regDao)) {
			regAtividade = new NotaAtividade(NotaAtividadeDaoImp.getNextId(), at.getId());
			registro.addRegistroAtividade(regAtividade);
			regAtDao.add(regAtividade);
		}
		return true;
	}
	
	private boolean addList(Atividade at) {
		if (atividades.contains(at)) {
			return false;
		} else {
			this.atividades.add(at);
			updateNextId();
			saveData();
			return true;
		}
	}
	@Override
	public boolean delete(Atividade atividade) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public Atividade get(int id) {
		for (Atividade atividade : atividades) {
			if (atividade.getId() == id) {
				return atividade;
			}
		}
		return null;
	}
	@Override
	public List<Atividade> get() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void listar() {
		System.out.println("--------------------");
		for (Atividade atividade : atividades) {
			System.out.println("-> " + atividade);
		}
		System.out.println("--------------------");
	}
	public int nextId() {
		return this.nextId();
	}
	@Override
	public boolean hasId(int id) {
		for (Atividade atividade : this.atividades) {
			if(atividade.getId() == id) {
				return true;
			}
		}
		return false;
	}	
	public static int getNextId(){
		return nextId;
	}
	private void updateNextId() {
		int id = 0;
		while(hasId(id)){
			id++;
		}
		nextId = id;
		return;
	}
	public boolean isEmpty() {
		return atividades.isEmpty();
	}
	@Override
	public void listarPorTurma(Turma turma) {
		System.out.println("--------------------");
		for (Atividade atividade : this.getByTurma(turma)) {
			System.out.println("-> " + atividade);
		}
		System.out.println("--------------------");
	}
	@Override
	public ArrayList<Atividade> getByTurma(Turma turma) {
		ArrayList<Atividade> lista = new ArrayList<Atividade>();
		for (Atividade atividade : atividades) {
			if (atividade.getTurmaId() == turma.getId()) {
				lista.add(atividade);
			}
		}
		return lista;
	}
	@Override
	public void clearAll() {
		atividades.clear();
	}

}
